package com.scut.scutzone.util;

import com.scut.scutzone.exception.BusinessException;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
 * @description: 文件存储工具类
 *
 * @author: erjie
 * @date: 2021-04-29 20:47
 */
public class FileUtil {
    //允许上传的文件扩展名
    private static final String[] allowTypes = { ".jpeg", ".png", ".jpg" };
    /**
     * @description: 为接受到的文件随机生成名称并保存
     * @param file 要保存的文件
     * @param savePath 保存路径，传入相对路径
     * @return 保存的文件名
     */
    public static String saveImage(String savePath, MultipartFile file) throws IOException {
        File folder = new File(savePath);
        if (!folder.isDirectory()) {
            folder.mkdirs();
        }
        //检查文件格式，仅检查扩展名
        if(!isValid(file)) {
            throw new BusinessException(400, "不支持的文件类型");
        }

        // 对上传的文件重命名，避免文件重名
        String oldName = file.getOriginalFilename();
        assert oldName != null;
        String newName = UUID.randomUUID().toString() + oldName.substring(oldName.lastIndexOf("."));


        byte [] bytes = file.getBytes();
        OutputStream out = new FileOutputStream(new File(folder, newName));
        out.write(bytes);

        return newName;
    }

    public static String[] saveImages(String savePath, MultipartFile[] files) throws IOException {
        List<String> filename = new ArrayList<>();
        if (files != null && files.length > 0) {
            for (MultipartFile file : files) {
                filename.add(saveImage(savePath, file));
            }
        }
        return filename.toArray(new String[0]);
    }

    //检查文件扩展名
    private static boolean isValid(MultipartFile file) {
        for (String type : allowTypes) {
            if (file.getOriginalFilename().endsWith(type)) {
                return true;
            }
        }
        return false;
    }


}

